package br.gov.ms.tce.modelo.dao.impl;

import java.util.Date;
import java.util.List;

import javax.inject.Named;
import javax.persistence.criteria.Predicate;

import br.gov.ms.tce.bean.cjur.Solicitacao;
import br.gov.ms.tce.bean.cjur.SolicitacaoItem;
import br.gov.ms.tce.bean.comum.PessoaFisica;
import br.gov.ms.tce.bean.comum.TipoClassificacao;
import br.gov.ms.tce.modelo.dao.SolicitacaoDAO;

@Named
public class SolicitacaoDAOJPA extends GenericDAOJPA<Solicitacao, Integer>
		implements SolicitacaoDAO{
	
	
	
    public void persist(Solicitacao solicitacao) {
    	for(SolicitacaoItem si : solicitacao.getSolicitacaoItems())
    		si.setSolicitacao(solicitacao);
    			
        super.persist(solicitacao);
    }

	/**
	 * @see br.gov.ms.tce.modelo.dao.SolicitacaoDAO#findByPessoSolicitanteAndPeriodoAndSituacao(br.gov.ms.tce.bean.comum.PessoaFisica, java.util.Date, java.util.Date, br.gov.ms.tce.bean.comum.TipoClassificacao)
	 */
	@Override
	public List<Solicitacao> findByPessoSolicitanteAndPeriodoAndSituacao(PessoaFisica pessoaSolicitante, Date dataInicio, Date dataFim,	TipoClassificacao situacao) {
		createCriteria();
		query.select(root);

		Predicate retrictions = cb.isNotNull(root.get("cod"));
		
		if(pessoaSolicitante!=null)
			retrictions = cb.and(cb.equal(root.get("pessoaSolicitante"), pessoaSolicitante),retrictions);
		
		
		
		if(situacao!=null)
			retrictions =  cb.and(cb.equal(root.get("situacao"), situacao),retrictions);
			
		
		if(dataInicio!=null){
			if(dataFim!=null){
				retrictions=cb.and(cb.<Date>between(root.<Date>get("dataSolicitacao"), dataInicio, dataFim),retrictions);
			}else{
				retrictions=cb.and(cb.equal(root.<Date>get("dataSolicitacao"), dataInicio),retrictions);
			}
		}
		query.where(retrictions).orderBy(cb.desc(root.get("cod")));
	
		return getResultList();
	}

}